#include "Cola.h"
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include "string.h"
#include <stdio.h>
#include <stdlib.h>
#include "log.h"

Cola::Cola(int id){
    idCola = msgget(ftok(FTOK_PATH, id), IPC_CREAT | 0666);
}

int Cola::enviar(int idMensaje, std::string mensaje){
    mensaje_t aEnviar;
    int restante = mensaje.size();
    int copiado = 0;
    int resultado=0;

    aEnviar.id = idMensaje;
    while(restante > 0){
	if(restante > MENSAJE_TAMANIO_MAX){
	    aEnviar.flags = FLAG_MAS_DATOS;
	    memcpy(aEnviar.buffer,mensaje.c_str()+copiado, MENSAJE_TAMANIO_MAX);
	    aEnviar.buffer[MENSAJE_TAMANIO_MAX-1] = '@';
	    copiado += MENSAJE_TAMANIO_MAX;
	    restante -= MENSAJE_TAMANIO_MAX;
	}
	else{
	    aEnviar.flags = FLAG_FIN_DATOS;
	    memcpy(aEnviar.buffer,mensaje.c_str()+copiado, restante);
	    memset(aEnviar.buffer+restante, 0, MENSAJE_TAMANIO_MAX-restante);
	    restante=0;
	}
	resultado = msgsnd(idCola, &aEnviar, sizeof(mensaje_t)-sizeof(long), 0);
	if( resultado == -1){
	    perror("Error al  enviar mensaje: ");
	    sleep(1);
	    return resultado;
	}
    }
    return resultado;
}

std::string Cola::recibir(int idMensaje){
    mensaje_t recibido;
    recibido.id = idMensaje;
    recibido.flags = FLAG_MAS_DATOS;
    std::string buffer;

    int bytesRecibidos = 0;
    while(recibido.flags == FLAG_MAS_DATOS){
	if(msgrcv(idCola, &recibido, sizeof(mensaje_t)-sizeof(long), idMensaje, 0) == -1){
	    perror("Error al recibir mensaje: ");
	    return "";
	}
	buffer += recibido.buffer;
	bytesRecibidos += MENSAJE_TAMANIO_MAX;
    }

    return buffer;
}

Cola::~Cola(){
    //msgctl(idCola, IPC_RMID, NULL);
}
